package semantico;

import lexico.Token;
import simbolos.Tipo;

/**
 * Implementa expressoes aritmeticas para operadores binarios, como por ex. '+' e '*'.
 * @author Cefanys
 */
public class ExpressaoAritmetica extends OperadorAritmetico{

	public Expressao expressao1;
	public Expressao expressao2;
	
	public ExpressaoAritmetica(Token token, Expressao expressao1, Expressao expressao2) throws SemanticoException{
		super(token, null);
		this.expressao1 = expressao1;
		this.expressao2 = expressao2;
		tipo = Tipo.tipoExpressao(expressao1.tipo, expressao2.tipo);
		
		if(tipo == null) montaErro(1, "");
	}
	
	/**
	 * Controi o lado direito de uma instrucao de tres enderecos, reduzindo as subexpressoes
	 * para enderecos e aplicando o operador aos enderecos.
	 * Exemplo: uma chamada de gerarTermo() na raiz para 'a+b*c' faz com que as chamadas para gerarConstante()
	 * retornem 'a' como o endereco para a subexpressao a e um temporario como endereco para 'b*c'
	 * @return
	 * @throws SemanticoException 
	 */
	public Expressao gerarTermo() throws SemanticoException{
		return new ExpressaoAritmetica(operador, expressao1.gerarConstante(), expressao2.gerarConstante());
	}

	public String toString(){
		return expressao1.toString() + " " + operador.toString() + " " + expressao2.toString();
	}
}
